package com.fjbdxk.beidou;

import com.fjbdxk.beidou.core.ByteUtils;
import com.fjbdxk.beidou.file.FileSlicerUtils;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.HashMap;

/**
 * MQTT接收示例
 *
 * @author huanggy
 * @version 1.0.0
 * @date 2024/05/14
 **/
public class MqttExample {

    private static int globalSize = 0;
    private static HashMap<String, String> noAndNameMap = new HashMap();

    public static void main(String[] args) throws IOException, InterruptedException {

        handleMsg("315F303030315F345F2545362538382539312545362539382541462545362542352538422545382541462539352545362539362538372545342542422542362E747874");

        Thread.sleep(500);
        handleMsg("325F303030315F315F4534423838304534424138434534423838394535394239424534424139344535383541444534423838334535383541424534423939444535384438314534423838304534424138434534423838394535394239424534424139344535383541444534423838334535383541424534423939444535384438314534423838304534424138434534423838394535394239424534424139344535383541444534423838334535383541424534423939444535384438314534423838304534424138434534423838394535");

        Thread.sleep(500);
        handleMsg("325F303030315F325F3942394245344241393445353835414445344238383345353835414245344239394445353844383145344238383045344241384345344238383945353942394245344241393445353835414445344238383345353835414245344239394445353844383145344238383045344241384345344238383945353942394245344241393445353835414445344238383345353835414245344239394445353844383145344238383045344241384345344238383945353942394245344241393445353835414445344238");

        Thread.sleep(500);
        handleMsg("325F303030315F335F3833453538354142453442393944453538443831453442383830453442413843453442383839453539423942453442413934453538354144453442383833453538354142453442393944453538443831453442383830453442413843453442383839453539423942453442413934453538354144453442383833453538354142453442393944453538443831453442383830453442413843453442383839453539423942453442413934453538354144453442383833453538354142453442393944453538443831");

        Thread.sleep(500);
        handleMsg("325F303030315F345F453442383830453442413843453442383839453539423942453442413934453538354144453442383833453538354142453442393944453538443831453442383830453442413843453442383839453539423942453442413934453538354144453442383833453538354142453442393944453538443831453442383830453442413843453442383839453539423942453442413934453538354144453442383833453538354142453442393944453538443831");

//        try {
//            MqttClient client = new MqttClient("tcp://192.168.2.241:1883",
//                    "mqttx_a86cd33c", new MemoryPersistence());
//
//            MqttConnectOptions connOpts = new MqttConnectOptions();
//            connOpts.setCleanSession(true);
//            connOpts.setUserName("odsc_FJBDXK");
//            connOpts.setPassword("hKrJVztPjDdS".toCharArray());
//            client.connect(connOpts);
//
//            client.subscribe("GET/FJBDXK/15950041"); // 订阅主题
//
//            // 消息回调
//            client.setCallback(new MqttCallback() {
//                @Override
//                public void connectionLost(Throwable cause) {
//                    System.out.println("Connection lost: " + cause.getMessage());
//                    cause.printStackTrace();
//                }
//
//                @Override
//                public void messageArrived(String topic, MqttMessage message) throws Exception {
//                    System.out.println("Message arrived on topic " + topic + ": " + new String(message.getPayload()));
//
//                    byte[] bytes = ByteUtils.hexStr2bytes(new String(message.getPayload()));
//                    String content = new String(bytes);
//
//                    String[] strs = content.split("_");
//                    // 发送文件名报文格式：1_{4位数字流水号}_{切片数量}_文件名
//                    System.out.println(strs[0]);
//                    if ("1".equals(strs[0])) {
//                        String no = strs[1];
//                        globalSize = Integer.valueOf(strs[2]);
//                        String fileName = URLDecoder.decode(strs[3]);
//                        System.out.println(no + globalSize + fileName);
//
//                        noAndNameMap.put(no, fileName);
//                    } else {
//                        // 文件数据报文格式：2_{4位数字流水号}_{当前切片数量}_文件内容
//                        String no = strs[1];
//                        int curSize = Integer.valueOf(strs[2]);
//                        byte[] data = ByteUtils.hexStr2bytes(strs[3]);
//                        FileOutputStream fos = new FileOutputStream("D:\\Application\\beidou\\tmp\\" + curSize);
//                        fos.write(data);
//
//                        if (curSize == globalSize) {
//                            String fileName = noAndNameMap.get(no);
//                            FileSlicerUtils.merger("D:\\Application\\beidou\\tmp\\", globalSize, "D:\\Application\\beidou\\file\\" + fileName);
//                        }
//                    }
//                }
//
//                @Override
//                public void deliveryComplete(IMqttDeliveryToken token) {
//                    // 消息发布完成
//                }
//            });
//
////            client.disconnect(); // 断开连接
////            System.out.println("Disconnected");
//        } catch (MqttException me) {
//            me.printStackTrace();
//            System.out.println("MqttException: " + me.getMessage());
//        }
    }

    private static void handleMsg(String message) throws IOException {

        byte[] bytes = ByteUtils.hexStr2bytes(message);
        String content = new String(bytes);

        String[] strs = content.split("_");
        // 发送文件名报文格式：1_{4位数字流水号}_{切片数量}_文件名
        if ("1".equals(strs[0])) {
            String no = strs[1];
            globalSize = Integer.valueOf(strs[2]);
            String fileName = URLDecoder.decode(strs[3]);
            System.out.println(no + globalSize + fileName);

            noAndNameMap.put(no, fileName);
        } else {
            // 文件数据报文格式：2_{4位数字流水号}_{当前切片数量}_文件内容
            String no = strs[1];
            int curSize = Integer.valueOf(strs[2]);
            byte[] data = ByteUtils.hexStr2bytes(strs[3]);
            FileOutputStream fos = new FileOutputStream("D:\\工作日期\\20240514\\tmp\\" + curSize);
            fos.write(data);

            if (curSize == globalSize) {
                String fileName = noAndNameMap.get(no);
                FileSlicerUtils.merger("D:\\工作日期\\20240514\\tmp\\", globalSize, "D:\\工作日期\\20240514\\" + fileName);
            }
        }
    }
}
